#include <iostream>
#include <mutex>
#include <memory>

using namespace std;

/**
 * 单例类
 * 1. 是一个类
 * 2. 整个程序只有一个实例
 * 
 * 实现步骤
 * 1. 将类指针声明为静态数据成员
 * 2. 将构造函数设置私有成员
 * 3. 声明一个静态成员函数并返回类指针
 * 4. 考虑多线程安全问题
*/

#define SVRAPP Server::getInstance()

class Server
{
private:
    Server();
    // static Server *self;
    static unique_ptr<Server> self;
    static mutex   selfMutex;
public:
    static Server* getInstance();
    ~Server();

    void start();
};

Server::Server(/* args */)
{
}

Server::~Server()
{
}

// Server* Server::self = nullptr;
unique_ptr<Server> Server::self(nullptr);
mutex Server::selfMutex;
Server* Server::getInstance()
{
    if(self == nullptr) {
        selfMutex.lock();
        if(self == nullptr) {
            // self = new Server;
            self.reset(new Server);
        }
        selfMutex.unlock();
    }
    return self.get();
}

void Server::start()
{
    cout << "Server::start()" << endl;
}

int main()
{
    // Server::getInstance()->start();
    SVRAPP->start();
    return 0;
}